home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / Kasumi / source / a64_resample.asm64 < prev    next >
Encoding:
Text File  |  2006-04-22  |  11.9 KB  |  593 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Graphics support library
  3. ;    Copyright (C) 1998-2004 Avery Lee
  4. ;
  5. ;    This program is free software; you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation; either version 2 of the License, or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License
  16. ;    along with this program; if not, write to the Free Software
  17. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ;
  19.  
  20.     .const
  21.  
  22.     align 16
  23. roundval        dq    0000200000002000h, 0000200000002000h
  24.  
  25.  
  26.     .code
  27.  
  28.  
  29. VDSAVE        macro    reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8
  30.  
  31.     ifnb <reg1>
  32.         VDSAVE        reg2, reg3, reg4, reg5, reg6, reg7, reg8
  33.  
  34.         push        reg1
  35.         .pushreg    reg1
  36.     endif
  37.  
  38.     endm
  39.  
  40. VDRESTORE    macro    reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8
  41.  
  42.     ifnb <reg1>
  43.         pop            reg1
  44.  
  45.         VDRESTORE        reg2, reg3, reg4, reg5, reg6, reg7, reg8
  46.     endif
  47.  
  48.     endm
  49.  
  50. VDSAVEXMM128    macro    regstart, regend
  51.     local count, stkoffset, reg, foo
  52.  
  53.     count = regend+1-regstart
  54.     stkoffset = 0
  55.     reg = regstart
  56.  
  57.     sub rsp, count*8
  58.     .allocstack count*8
  59.  
  60.     while reg le regend
  61.         foo textequ %reg
  62.         movq qword ptr [rsp+stkoffset], @CatStr(xmm, %(foo))
  63.  
  64.         stkoffset = stkoffset+8
  65.         reg = reg+1
  66.     endm
  67.     endm
  68.  
  69. VDRESTOREXMM128    macro    regstart, regend
  70.     local count, stkoffset, reg, foo
  71.  
  72.     count = regend+1-regstart
  73.     stkoffset = count*8
  74.     reg = regend
  75.  
  76.     while regstart le reg
  77.         foo textequ %reg
  78.         stkoffset = stkoffset-8
  79.         movq @CatStr(xmm, %(foo)), qword ptr [rsp+stkoffset]
  80.  
  81.         reg = reg-1
  82.     endm
  83.  
  84.     add rsp, count*8
  85.     endm
  86.  
  87. ;-------------------------------------------------------------------------
  88. ;
  89. ;    long vdasm_resize_table_row_SSE2(
  90. ;        Pixel *out,            // rcx
  91. ;        Pixel *in,            // rdx
  92. ;        int *filter,        // r8
  93. ;        int filter_width,    // r9d
  94. ;        PixDim w,            // [rsp+40]
  95. ;        long accum,            // [rsp+48]
  96. ;        long frac);            // [rsp+56]
  97. ;
  98. vdasm_resize_table_row_SSE2    proc    frame
  99.  
  100.     VDSAVE            rbx, rsi, rdi, rbp, r12, r13, r14, r15
  101.     VDSAVEXMM128    6, 15
  102.     .endprolog
  103.  
  104.     @parms equ rsp+80+64
  105.  
  106.     mov            r10d, dword ptr [@parms+40]
  107.     shl            r10, 2
  108.     add            rcx, r10
  109.     neg            r10
  110.     shl            r9d, 2                    ;filter_width <<= 2
  111.  
  112.     movaps        xmm6, xmmword ptr roundval
  113.     pxor        xmm5, xmm5
  114.     mov            rsi, rdx
  115.     shr            rsi, 2
  116.  
  117.     mov            edi, [@parms+48]
  118.     mov            eax, edi
  119.     shl            edi, 16
  120.     sar            rax, 16
  121.     add            rsi, rax
  122.     mov            ebp, [@parms+56]
  123.     movsxd        r11, ebp
  124.     shl            ebp, 16
  125.     sar            r11, 16
  126.  
  127.     ;register map
  128.     ;
  129.     ;eax        temp coefficient pair counter
  130.     ;rbx        temp coefficient pointer
  131.     ;rcx        destination
  132.     ;rdx        temp source
  133.     ;rsi        source/4
  134.     ;edi        accumulator
  135.     ;ebp        fractional increment
  136.     ;r8            filter
  137.     ;r9            filter_width*4
  138.     ;r10        -width*4
  139.     ;r11        integral increment
  140.     ;r12
  141.     ;r13
  142.     ;r14
  143.     ;r15
  144.  
  145.     cmp            r9d, 16
  146.     jz            @accel_4coeff
  147.     cmp            r9d, 24
  148.     jz            @accel_6coeff
  149.  
  150.     test        r9d, 8
  151.     jz            @pixelloop_even_pairs
  152.  
  153. @pixelloop_odd_pairs:
  154.     movdqa        xmm4, xmm6
  155.  
  156.     mov            eax, edi
  157.     shr            eax, 24
  158.     imul        eax, r9d
  159.     lea            rbx, [r8+rax]
  160.  
  161.     lea            rdx, [rsi*4]
  162.     lea            rax, [r9-8]
  163. @coeffloop_odd_pairs:
  164.     movd        xmm0, dword ptr [rdx]            ;xmm0 = p0
  165.     movd        xmm1, dword ptr [rdx+4]        ;xmm1 = p1
  166.     movd        xmm2, dword ptr [rdx+8]        ;xmm2 = p2
  167.     movd        xmm3, dword ptr [rdx+12]        ;xmm3 = p3
  168.     add            rdx, 16
  169.     punpcklbw    xmm0, xmm1
  170.     punpcklbw    xmm2, xmm3
  171.     punpcklbw    xmm0, xmm5
  172.     punpcklbw    xmm2, xmm5
  173.     movq        xmm1, qword ptr [rbx]
  174.     movq        xmm3, qword ptr [rbx+8]
  175.     add            rbx, 16
  176.     pshufd        xmm1, xmm1, 01000100b
  177.     pshufd        xmm3, xmm3, 01000100b
  178.     pmaddwd        xmm0, xmm1
  179.     pmaddwd        xmm2, xmm3
  180.     paddd        xmm0, xmm2
  181.     paddd        xmm4, xmm0
  182.     sub            eax, 16
  183.     jnz            @coeffloop_odd_pairs
  184.  
  185.     movd        xmm0, dword ptr [rdx]            ;xmm0 = p0
  186.     movd        xmm1, dword ptr [rdx+4]        ;xmm1 = p1
  187.     punpcklbw    xmm0, xmm1
  188.     punpcklbw    xmm0, xmm5
  189.     movq        xmm1, qword ptr [rbx]
  190.     pshufd        xmm1, xmm1, 01000100b
  191.     pmaddwd        xmm0, xmm1
  192.     paddd        xmm4, xmm0
  193.  
  194.     psrad        xmm4, 14
  195.     packssdw    xmm4, xmm4
  196.     packuswb    xmm4, xmm4
  197.  
  198.     add            edi, ebp
  199.     adc            rsi, r11
  200.  
  201.     movd        dword ptr [rcx+r10], xmm4
  202.     add            r10, 4
  203.     jnz            @pixelloop_odd_pairs
  204.     jmp            @xit
  205.  
  206. @pixelloop_even_pairs:
  207.     movdqa        xmm4, xmm6
  208.  
  209.     mov            eax, edi
  210.     shr            eax, 24
  211.     imul        eax, r9d
  212.     lea            rbx, [r8+rax]
  213.  
  214.     lea            rdx, [rsi*4]
  215.     mov            eax, r9d
  216. @coeffloop_even_pairs:
  217.     movd        xmm0, dword ptr [rdx]            ;xmm0 = p0
  218.     movd        xmm1, dword ptr [rdx+4]        ;xmm1 = p1
  219.     movd        xmm2, dword ptr [rdx+8]        ;xmm2 = p2
  220.     movd        xmm3, dword ptr [rdx+12]        ;xmm3 = p3
  221.     add            rdx, 16
  222.     punpcklbw    xmm0, xmm1
  223.     punpcklbw    xmm2, xmm3
  224.     punpcklbw    xmm0, xmm5
  225.     punpcklbw    xmm2, xmm5
  226.     movq        xmm1, qword ptr [rbx]
  227.     movq        xmm3, qword ptr [rbx+8]
  228.     add            rbx, 16
  229.     pshufd        xmm1, xmm1, 01000100b
  230.     pshufd        xmm3, xmm3, 01000100b
  231.     pmaddwd        xmm0, xmm1
  232.     pmaddwd        xmm2, xmm3
  233.     paddd        xmm0, xmm2
  234.     paddd        xmm4, xmm0
  235.     sub            eax, 16
  236.     jnz            @coeffloop_even_pairs
  237.  
  238.     psrad        xmm4, 14
  239.     packssdw    xmm4, xmm4
  240.     packuswb    xmm4, xmm4
  241.  
  242.     add            edi, ebp
  243.     adc            rsi, r11
  244.  
  245.     movd        dword ptr [rcx+r10], xmm4
  246.     add            r10, 4
  247.     jnz            @pixelloop_even_pairs
  248.  
  249. @xit:
  250.     VDRESTOREXMM128    6, 15
  251.     VDRESTORE    rbx, rsi, rdi, rbp, r12, r13, r14, r15
  252.     ret
  253.  
  254. @accel_4coeff:
  255. @pixelloop_4coeff:
  256.     pxor        xmm5, xmm5
  257.     movdqa        xmm4, xmm6
  258.  
  259.     mov            eax, 0ff000000h
  260.     lea            rdx, [rsi*4]
  261.     and            eax, edi
  262.     shr            eax, 20
  263.     lea            rbx, [r8+rax]
  264.  
  265.     movd        xmm0, dword ptr [rdx]            ;xmm0 = p0
  266.     movd        xmm1, dword ptr [rdx+4]        ;xmm1 = p1
  267.     movd        xmm2, dword ptr [rdx+8]        ;xmm2 = p2
  268.     movd        xmm3, dword ptr [rdx+12]        ;xmm3 = p3
  269.     punpcklbw    xmm0, xmm1
  270.     punpcklbw    xmm2, xmm3
  271.     punpcklbw    xmm0, xmm5
  272.     punpcklbw    xmm2, xmm5
  273.     movq        xmm1, qword ptr [rbx]
  274.     movq        xmm3, qword ptr [rbx+8]
  275.     pshufd        xmm1, xmm1, 01000100b
  276.     pshufd        xmm3, xmm3, 01000100b
  277.     pmaddwd        xmm0, xmm1
  278.     pmaddwd        xmm2, xmm3
  279.     paddd        xmm0, xmm2
  280.     paddd        xmm4, xmm0
  281.  
  282.     psrad        xmm4, 14
  283.     packssdw    xmm4, xmm4
  284.     packuswb    xmm4, xmm4
  285.  
  286.     add            edi, ebp
  287.     adc            rsi, r11
  288.  
  289.     movd        dword ptr [rcx+r10], xmm4
  290.     add            r10, 4
  291.     jnz            @pixelloop_4coeff
  292.     jmp            @xit
  293.  
  294. @accel_6coeff:
  295. @pixelloop_6coeff:
  296.     pxor        xmm5, xmm5
  297.     movdqa        xmm4, xmm6
  298.  
  299.     lea            rdx, [rsi*4]
  300.     mov            eax, edi
  301.     shr            eax, 24
  302.     lea            rax, [rax+rax*2]
  303.     lea            rbx, [r8+rax*8]
  304.  
  305.     movd        xmm0, dword ptr [rdx]            ;xmm0 = p0
  306.     movd        xmm1, dword ptr [rdx+4]        ;xmm1 = p1
  307.     movd        xmm2, dword ptr [rdx+8]        ;xmm2 = p2
  308.     movd        xmm3, dword ptr [rdx+12]        ;xmm3 = p3
  309.     movd        xmm8, dword ptr [rdx+16]        ;xmm6 = p4
  310.     movd        xmm9, dword ptr [rdx+20]        ;xmm7 = p5
  311.     punpcklbw    xmm0, xmm1
  312.     punpcklbw    xmm2, xmm3
  313.     punpcklbw    xmm8, xmm9
  314.     punpcklbw    xmm0, xmm5
  315.     punpcklbw    xmm2, xmm5
  316.     punpcklbw    xmm8, xmm5
  317.     movq        xmm1, qword ptr [rbx]
  318.     movq        xmm3, qword ptr [rbx+8]
  319.     movq        xmm9, qword ptr [rbx+16]
  320.     pshufd        xmm1, xmm1, 01000100b
  321.     pshufd        xmm3, xmm3, 01000100b
  322.     pshufd        xmm9, xmm9, 01000100b
  323.     pmaddwd        xmm0, xmm1
  324.     pmaddwd        xmm2, xmm3
  325.     pmaddwd        xmm8, xmm9
  326.     paddd        xmm0, xmm2
  327.     paddd        xmm4, xmm0
  328.     paddd        xmm4, xmm8
  329.  
  330.     psrad        xmm4, 14
  331.     packssdw    xmm4, xmm4
  332.     packuswb    xmm4, xmm4
  333.  
  334.     add            edi, ebp
  335.     adc            rsi, r11
  336.  
  337.     movd        dword ptr [rcx+r10], xmm4
  338.     add            r10, 4
  339.     jnz            @pixelloop_6coeff
  340.     jmp            @xit
  341.  
  342. vdasm_resize_table_row_SSE2    endp
  343.  
  344.  
  345. ;--------------------------------------------------------------------------
  346. ;
  347. ;    vdasm_resize_table_col_SSE2(
  348. ;        uint32 *dst,                // rcx
  349. ;        const uint32 *const *srcs,    // rdx
  350. ;        int *filter,        // r8
  351. ;        int filter_width,    // r9d
  352. ;        PixDim w,            // [rsp+40] -> r10d
  353. ;        );
  354. ;
  355. vdasm_resize_table_col_SSE2    proc    frame
  356.     VDSAVE            rbx, rsi, rdi, rbp, r12, r13, r14, r15
  357.     VDSAVEXMM128    6, 15
  358.     .endprolog
  359.  
  360.     @parms equ rsp+80+64
  361.  
  362.     mov            r10d, [@parms+40]            ;r10d = w
  363.  
  364.     pxor        xmm5, xmm5
  365.     movdqa        xmm4, xmmword ptr roundval
  366.     xor            rbx, rbx                    ;rbx = source offset
  367.  
  368.     cmp            r9d, 4
  369.     jz            @accel_4coeff
  370.     cmp            r9d, 6
  371.     jz            @accel_6coeff
  372.  
  373.     shr            r9d, 1                        ;r9d = filter pair count
  374.  
  375. @pixelloop:
  376.     mov            rax, rdx                    ;rax = row pointer table
  377.     mov            rdi, r8                        ;rdi = filter
  378.     mov            r11d, r9d                    ;r11d = filter width counter
  379.     movdqa        xmm2, xmm4
  380. @coeffloop:
  381.     mov            rsi, [rax]
  382.  
  383.     movd        xmm0, dword ptr [rsi+rbx]
  384.  
  385.     mov            rsi, [rax+8]
  386.     add            rax, 16
  387.  
  388.     movd        xmm1, dword ptr [rsi+rbx]
  389.     punpcklbw    xmm0, xmm1
  390.  
  391.     punpcklbw    xmm0, xmm5
  392.  
  393.     movq        xmm1, qword ptr [rdi]
  394.     pshufd        xmm1, xmm1, 01000100b
  395.  
  396.     pmaddwd        xmm0, xmm1
  397.  
  398.     paddd        xmm2, xmm0
  399.  
  400.     add            rdi,8
  401.  
  402.     sub            r11d,1
  403.     jne            @coeffloop
  404.  
  405.     psrad        xmm2,14
  406.     packssdw    xmm2,xmm2
  407.     add            rbx,4
  408.     packuswb    xmm2,xmm2
  409.  
  410.     movd        dword ptr [rcx],xmm2
  411.     add            rcx,4
  412.     sub            r10d,1
  413.     jne            @pixelloop
  414.  
  415. @xit:
  416.     VDRESTOREXMM128    6, 15
  417.     VDRESTORE    rbx, rsi, rdi, rbp, r12, r13, r14, r15
  418.     ret
  419.  
  420. @accel_4coeff:
  421.     mov            r12, [rdx]
  422.     mov            r13, [rdx+8]
  423.     mov            r14, [rdx+16]
  424.     mov            r15, [rdx+24]
  425.     movq        xmm8, qword ptr [r8]
  426.     punpcklqdq    xmm8, xmm8
  427.     movq        xmm9, qword ptr [r8+8]
  428.     punpcklqdq    xmm9, xmm9
  429.  
  430.     sub            r10d, 1
  431.     jc            @oddpixel_4coeff
  432. @pixelloop_4coeff:
  433.     movq        xmm0, qword ptr [r12+rbx]
  434.     movq        xmm1, qword ptr [r13+rbx]
  435.     movq        xmm2, qword ptr [r14+rbx]
  436.     movq        xmm3, qword ptr [r15+rbx]
  437.  
  438.     punpcklbw    xmm0, xmm1
  439.     punpcklbw    xmm2, xmm3
  440.  
  441.     movdqa        xmm1, xmm0
  442.     movdqa        xmm3, xmm2
  443.  
  444.     punpcklbw    xmm0, xmm5
  445.     punpckhbw    xmm1, xmm5
  446.     punpcklbw    xmm2, xmm5
  447.     punpckhbw    xmm3, xmm5
  448.  
  449.     pmaddwd        xmm0, xmm8
  450.     pmaddwd        xmm1, xmm8
  451.     pmaddwd        xmm2, xmm9
  452.     pmaddwd        xmm3, xmm9
  453.  
  454.     paddd        xmm0, xmm4
  455.     paddd        xmm1, xmm4
  456.     paddd        xmm0, xmm2
  457.     paddd        xmm1, xmm3
  458.  
  459.     psrad        xmm0, 14
  460.     psrad        xmm1, 14
  461.     packssdw    xmm0, xmm1
  462.     packuswb    xmm0, xmm0
  463.  
  464.     movq        qword ptr [rcx], xmm0
  465.     add            rcx, 8
  466.     add            rbx, 8
  467.     sub            r10d, 2
  468.     ja            @pixelloop_4coeff
  469.     jnz            @xit
  470. @oddpixel_4coeff:
  471.     movd        xmm0, dword ptr [r12+rbx]
  472.     movd        xmm1, dword ptr [r13+rbx]
  473.     movd        xmm2, dword ptr [r14+rbx]
  474.     movd        xmm3, dword ptr [r15+rbx]
  475.  
  476.     punpcklbw    xmm0, xmm1
  477.     punpcklbw    xmm2, xmm3
  478.     punpcklbw    xmm0, xmm5
  479.     punpcklbw    xmm2, xmm5
  480.  
  481.     pmaddwd        xmm0, xmm8
  482.     pmaddwd        xmm2, xmm9
  483.  
  484.     paddd        xmm0, xmm4
  485.     paddd        xmm0, xmm2
  486.  
  487.     psrad        xmm0, 14
  488.     packssdw    xmm0, xmm0
  489.     packuswb    xmm0, xmm0
  490.  
  491.     movd        dword ptr [rcx], xmm0
  492.  
  493.     jmp            @xit
  494.  
  495. @accel_6coeff:
  496.     mov            r12, [rdx]
  497.     mov            r13, [rdx+8]
  498.     mov            r14, [rdx+16]
  499.     mov            r15, [rdx+24]
  500.     mov            rsi, [rdx+32]
  501.     mov            rdx, [rdx+40]
  502.     movq        xmm10, qword ptr [r8]
  503.     punpcklqdq    xmm10, xmm10
  504.     movq        xmm11, qword ptr [r8+8]
  505.     punpcklqdq    xmm11, xmm11
  506.     movq        xmm12, qword ptr [r8+16]
  507.     punpcklqdq    xmm12, xmm12
  508.  
  509.     sub            r10d, 1
  510.     jc            @oddpixel_6coeff
  511. @pixelloop_6coeff:
  512.     movq        xmm0, qword ptr [r12+rbx]
  513.     movq        xmm1, qword ptr [r13+rbx]
  514.     movq        xmm2, qword ptr [r14+rbx]
  515.     movq        xmm3, qword ptr [r15+rbx]
  516.     movq        xmm8, qword ptr [rsi+rbx]
  517.     movq        xmm9, qword ptr [rdx+rbx]
  518.  
  519.     punpcklbw    xmm0, xmm1
  520.     punpcklbw    xmm2, xmm3
  521.     punpcklbw    xmm8, xmm9
  522.  
  523.     movdqa        xmm1, xmm0
  524.     movdqa        xmm3, xmm2
  525.     movdqa        xmm9, xmm8
  526.  
  527.     punpcklbw    xmm0, xmm5
  528.     punpckhbw    xmm1, xmm5
  529.     punpcklbw    xmm2, xmm5
  530.     punpckhbw    xmm3, xmm5
  531.     punpcklbw    xmm8, xmm5
  532.     punpckhbw    xmm9, xmm5
  533.  
  534.     pmaddwd        xmm0, xmm10
  535.     pmaddwd        xmm1, xmm10
  536.     pmaddwd        xmm2, xmm11
  537.     pmaddwd        xmm3, xmm11
  538.     pmaddwd        xmm8, xmm12
  539.     pmaddwd        xmm9, xmm12
  540.  
  541.     paddd        xmm0, xmm4
  542.     paddd        xmm1, xmm4
  543.     paddd        xmm2, xmm8
  544.     paddd        xmm3, xmm9
  545.     paddd        xmm0, xmm2
  546.     paddd        xmm1, xmm3
  547.  
  548.     psrad        xmm0, 14
  549.     psrad        xmm1, 14
  550.     packssdw    xmm0, xmm1
  551.     packuswb    xmm0, xmm0
  552.  
  553.     movq        qword ptr [rcx], xmm0
  554.     add            rcx, 8
  555.     add            rbx, 8
  556.     sub            r10d, 2
  557.     ja            @pixelloop_6coeff
  558.     jnz            @xit
  559. @oddpixel_6coeff:
  560.     movd        xmm0, dword ptr [r12+rbx]
  561.     movd        xmm1, dword ptr [r13+rbx]
  562.     movd        xmm2, dword ptr [r14+rbx]
  563.     movd        xmm3, dword ptr [r15+rbx]
  564.     movd        xmm8, dword ptr [rsi+rbx]
  565.     movd        xmm9, dword ptr [rdx+rbx]
  566.  
  567.     punpcklbw    xmm0, xmm1
  568.     punpcklbw    xmm2, xmm3
  569.     punpcklbw    xmm8, xmm9
  570.     punpcklbw    xmm0, xmm5
  571.     punpcklbw    xmm2, xmm5
  572.     punpcklbw    xmm8, xmm5
  573.  
  574.     pmaddwd        xmm0, xmm10
  575.     pmaddwd        xmm2, xmm11
  576.     pmaddwd        xmm8, xmm12
  577.  
  578.     paddd        xmm0, xmm4
  579.     paddd        xmm2, xmm8
  580.     paddd        xmm0, xmm2
  581.  
  582.     psrad        xmm0, 14
  583.     packssdw    xmm0, xmm0
  584.     packuswb    xmm0, xmm0
  585.  
  586.     movd        dword ptr [rcx], xmm0
  587.  
  588.     jmp            @xit
  589.  
  590. vdasm_resize_table_col_SSE2    endp
  591.  
  592.     end
  593.